package 栈和队列.栈实现队列;

import java.util.ArrayDeque;
import java.util.Deque;

/**
 * @author: wh(1835734390 @ qq.com)
 * @date: 2023/1/18 10:49
 * @description:建立两个栈，一个负责入栈，一个负责出栈。
 * @version:
 */
class MyQueue {
    //两个栈有可能存在都有元素的情况，这是正常的。
    Deque<Integer> inStack;
    Deque<Integer> outStack;

    public MyQueue() {
        inStack = new ArrayDeque<Integer>();
        outStack = new ArrayDeque<Integer>();
    }

    //入队 入队正常向入栈中入即可
    public void push(int x) {
        inStack.push(x);
    }

    //出队 出队就是把一个栈的数据全部导入另外一个栈中，然后取栈顶元素，以此达到先进先出的目的
    public int pop() {
        if (outStack.isEmpty()) {
            in2out();
        }
        return outStack.pop();
    }

    //返回队列开头元素 返回队列开头元素和出队的原理一样
    public int peek() {
        if (outStack.isEmpty()) {
            in2out();
        }
        return outStack.peek();
    }

    //判断是否为空 需要判断两个栈是否都为空
    public boolean empty() {
        return inStack.isEmpty() && outStack.isEmpty();
    }

    private void in2out() {
        while (!inStack.isEmpty()) {
            outStack.push(inStack.pop());
        }
    }
}

